/*
 * Parser.cpp
 *
 *  Created on: 27.11.2009
 *      Author: Sergej Schmidt
 *      version 003
 */

#include "Parser.h"

using namespace std;

Parser::Parser()
{
	m_bGeladen = false;
}
Parser::Parser(Parser* src)
{
	m_mapTabelle.clear();
	for( _mapIterator = src->getMap()->begin(); _mapIterator != src->getMap()->end(); ++_mapIterator )
	{
		m_mapTabelle[ (*_mapIterator).first ] = (*_mapIterator).second;
	}
}
Parser::Parser(string filename)
{
	// заполнить таблиу
	Load( filename );
}

Parser::~Parser()
{
	m_mapTabelle.clear();
}

void Parser::Load(string filename)
{
	ifstream file;
	char buffer[256];
	string temp;
	string tmpL,tmpR;
	size_t position;
	file.open( filename.c_str() );
	if( !file.good() ) throw SwsoException("Ошибка при открытие файла " + filename, __LINE__);
	m_strFilename = filename;
	while( file.good() )
	{
		file.getline(buffer, 256);
		temp = buffer;
		while((temp.substr(0,1)==" " || temp.substr(0,1)=="\t")&&(temp.length()>2))
		{
			temp = temp.substr(1,temp.length()-1);
		}
		if( buffer[0]=='#' || buffer[0]==';' || temp.length()<2 ) continue; // коментарий
		position = temp.find("=");
		if( position < 1 ) continue;
		tmpL = temp.substr( 0, position );
		if( position > temp.length()-2 )
		{
			tmpR = "0";
		}
		else
		{
			tmpR = temp.substr( position+1, temp.length()-position-1 );
		}
		m_mapTabelle[tmpL] = tmpR;
		m_bGeladen = true;
	}
	file.close();
}
/*
 * ВНИМАНИЕ с этой методой пропадают все коментарии
 */
void Parser::Save(void)
{
	this->Save( m_strFilename );
}
void Parser::Save(string filename)
{
	if(m_mapTabelle.empty()) return;
	ofstream file;
	file.open( filename.c_str() );
	if( file.good() )
	{
		for( _mapIterator = m_mapTabelle.begin(); _mapIterator != m_mapTabelle.end(); ++_mapIterator )
		{
			file << (*_mapIterator).first << "=" << (*_mapIterator).second << endl;
		}
	}
	file.close();
}
void Parser::SaveElement(string element)
{
	string 	str,str2;
	string	value;
	int		pos;
	_mapIterator = m_mapTabelle.find( element );
	if(_mapIterator == m_mapTabelle.end()) throw SwsoException( "Элемент" + element + " не найден", __LINE__);
	value = _mapIterator->second;
#ifdef	DEBUG
	cout << "value = " << value << endl;
#endif
	// загрузка файла
	LoadFileliste();
	if( m_listFile.empty() ) throw SwsoException("listFile ist leer");
	// поиск строки с элиментом
	for( _listIterator = m_listFile.begin(); _listIterator != m_listFile.end(); ++_listIterator )
	{
		str = (*_listIterator);
		pos = str.find( element + "=" );
		if( pos >= 0 )
		{
			pos += (element.length()+1);
			(*_listIterator) = str.substr( 0, pos ) + value;
			break;
		}
	}
	//m_listFile.pop_back();
	SaveFileliste();
}
void Parser::SaveElements()
{
	if(m_mapTabelle.empty())
	{
		cout << "Нет элементов" << endl;
		return;
	}
	for( _mapIterator = m_mapTabelle.begin(); _mapIterator != m_mapTabelle.end(); ++_mapIterator )
	{
		SaveElement((*_mapIterator).first);
	}
}
void Parser::LoadFileliste()
{
	char	buffer[1024];
	string	tmp;
	m_listFile.clear();
	// загрузка файла
	ifstream file( m_strFilename.c_str() );
	if( !file.good() ) throw SwsoException("файл " + m_strFilename + " не найден", __LINE__);
	while( file.good() )
	{
		file.getline( buffer, 1024 );
		tmp = buffer;
		if(!tmp.empty())
		{
			m_listFile.push_back( tmp );
		}
	}
	file.close();
}
void Parser::SaveFileliste()
{
	ofstream file( m_strFilename.c_str() );
	if( !file.good() )  throw SwsoException("Ошибка при сохранение Filelista" , __LINE__);
	for( _listIterator = m_listFile.begin(); _listIterator != m_listFile.end(); ++_listIterator )
	{
		file << (*_listIterator) << endl;
	}
	file.close();
}
#ifdef DEBUG
/*
 * Debuger методе
 */
void Parser::Out()
{
	cout << "Ausgabe von " << m_mapTabelle.size() << " Elementen" << endl;
	if(m_mapTabelle.empty()) return;
	for( _mapIterator = m_mapTabelle.begin(); _mapIterator != m_mapTabelle.end(); ++_mapIterator )
	{
		cout << (*_mapIterator).first << " = " << (*_mapIterator).second << endl;
	}
}
#endif

string Parser::getString( string element)
{
	return m_mapTabelle[element];
}

int Parser::getInt( string element )
{
	int ret;
	std::stringstream sstr(m_mapTabelle[element]);
	sstr >> ret;
	return ret;
}

void Parser::setValue( string element, string value )
{
	m_mapTabelle[element] = value;
}

void Parser::setValue( string element, int value )
{
	string tmp;
	IntToString( value, tmp );
	this->setValue( element, tmp );
}

void Parser::setValue( string element, float value )
{
	string tmp;
	FloatToString( value, tmp );
	this->setValue( element, tmp );
}

void Parser::setValue( string element, size_t value )
{
    ostringstream temp;
    temp << value;
	string tmp = temp.str();
	this->setValue( element, tmp );
}

void Parser::SaveTmp()
{
	m_mapTmp = m_mapTabelle;
}

void Parser::LoadTmp()
{
	m_mapTabelle = m_mapTmp;
}

void Parser::prepareMyGUI( MyGUI::Gui* gui )
{
	if(m_mapTabelle.empty()) return;
	for( _mapIterator = m_mapTabelle.begin(); _mapIterator != m_mapTabelle.end(); ++_mapIterator )
	{
		gui->findWidgetT( (*_mapIterator).first )->setCaption( (*_mapIterator).second );
	}
}

Parser* Parser::operator = ( Parser* src)
{
	m_mapTabelle.clear();
	for( _mapIterator = src->getMap()->begin(); _mapIterator != src->getMap()->end(); ++_mapIterator )
	{
		m_mapTabelle[ (*_mapIterator).first ] = (*_mapIterator).second;
	}
	cout << "parser copiert" << endl;
	return this;
}
